package com.ywl.stream;

import com.ywl.entity.Author;
import com.ywl.entity.Book;
import com.ywl.utils.AuthorFactory;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;

/**
 * 中间操作 flatMap
 *
 * @author 24040
 * @name StreamDemo04
 * @date 2022-08-22 10:37
 */
public class StreamDemo04 {

    public static void main(String[] args) {
        List<Author> authors = AuthorFactory.getAuthors();
//        test01(authors);
        test02(authors);
    }

    /**
     *  打印所有书籍的名字。要求对重复的元素进行去重。
     */
    private static void test01(List<Author> authors) {
        /*authors.stream()
                .distinct()
                .map(author -> author.getBooks())
                .forEach(item-> System.out.println(item));*/
        authors.stream()
                .flatMap((Function<Author, Stream<Book>>) author -> {
                    //返回的是流对象
                    return author.getBooks().stream();
                })
                .distinct()
                .forEach(book -> System.out.println(book.getName()));
    }

    /**
     * 打印现有数据的所有分类。要求对分类进行去重。不能出现这种格式：哲学,爱情
     */
    private static void test02(List<Author> authors){
        //1.先要获取作家
        authors.stream()
                //2.拿到作者的书，再对书的分类进行处理
                .flatMap(author-> author.getBooks().stream())
                //3.进行图书的去重操作
                .distinct()
                //4.把book中的分类转换为数组并转换为流
                .flatMap(book-> Arrays.stream(book.getCategory().split(",")))
                //5.对分类进行去重操作
                .distinct()
                .forEach(category-> System.out.println(category));
    }


}
